package ar.edu.caece.pl.asin.manager.impl;

import ar.edu.caece.pl.alex.model.IToken;
import ar.edu.caece.pl.asin.manager.IAnalizadorSintactico;
import ar.edu.caece.pl.asin.model.ITokenStream;
import ar.edu.caece.pl.asin.model.impl.Header;
import ar.edu.caece.pl.asin.model.impl.ProcsFuncs;

public class AnalizadorSintactico extends AbstractAnalizadorSintactico implements IAnalizadorSintactico {
	
	/* INICIALIZACION */	
	public AnalizadorSintactico ( ITokenStream ts ) {
		super(ts, false);
	}
	public AnalizadorSintactico ( ITokenStream ts, boolean debugMode ) {
		super(ts,debugMode);
	}
	
	
	/**
	 * Devuelve true si reconoce toda la sarta
	 */
	public boolean reconocer () {
		
		/** El algoritmo es: antes de avanzar y leer decido el camino
		 *  Luego se llama a la clase que reconoce dicho camino.
		 *  Dentro de ella se avanzara si es reconocido, pero siempre hay que dejar 
		 *  el cursor uno antes del actual para revisar todo con getTokenSiguiente();
		 *  El this.avanzar() lo llamará unicamente this.reconocerToken() 
		 */
		
		boolean recognized = true; //(asumimos correctitud hasta demostrar lo contrario)
		
		//----------------------------------------------
		//Agrego info de debug de la produccion
		em.debug( "Reconocer Programa.\n" +
				  "<PROGRAMA> -> <HEADER> <PROCS_FUNCS> EOF");	//TODO pasarlo a accion semantica
		//----------------------------------------------
		
		/* <PROGRAMA> -> <HEADER> <PROCS_FUNCS> EOF */
		
		// Reconocer Header
		while ( Header.primeros(this.getTokenSiguiente()) ) {
			
			Header h = new Header(this.tokenStream, this.debugMode);
			recognized &= h.reconocer();
		}
		
		// Reconocer Procedimientos o Funciones
		while ( ProcsFuncs.primeros(this.getTokenSiguiente()) ) {
			
			ProcsFuncs pfs = new ProcsFuncs(this.tokenStream,this.debugMode);
			recognized &= pfs.reconocer();
		}
		
		//En este punto deberia encontrar TOKEN_FIN_DE_ARCHIVO
		recognized &= this.reconocerToken(IToken.TYPE_FIN_DE_ARCHIVO);

		return recognized;
	}
}
